package TabuSearch;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class HeuristicaConstrutora {
	
	public List<Estacao> geraSolucaoInicial(List<Estacao> estacoes, int[] arrayPontosCobertos){
		List<Estacao> solucao = new ArrayList<Estacao>();
		List<Estacao> listaEstacoesFaltantes = estacoes;
		int indexEstacao;		
		
		Collections.sort(listaEstacoesFaltantes, new Comparator<Estacao>() {  
			             public int compare(Estacao o1, Estacao o2) {  
				                 Estacao e1 = o1;  
				                 Estacao e2 = o2;  
				                 return e1.getCustoPorPonto() < e2.getCustoPorPonto() ? -1 : (e1.getCustoPorPonto() > e2.getCustoPorPonto() ? +1 : 0);  
				             }  
				         });
				
		for(int j=0; j<arrayPontosCobertos.length; j++){
			Estacao e; 
			boolean achou = false;
			if(arrayPontosCobertos[j] == 0){
				indexEstacao = 0;				
				while(achou == false){
					if(indexEstacao >= listaEstacoesFaltantes.size()){
						System.out.println("Nao existe conjunto com o elemento "+ (j+1));
						return null;
					}
					e = listaEstacoesFaltantes.get(indexEstacao);
					
					List<Integer> pontos = e.getPontosCobertos();
					for (int k=0; k<e.getPontosCobertos().size(); k++){
						int ui = e.getPontosCobertos().get(k);
						if(ui==j+1){						
							solucao.add(e);
							listaEstacoesFaltantes.remove(e);
							for(int i=0; i<pontos.size(); i++){
								arrayPontosCobertos[pontos.get(i)-1]++;							
							}
							achou = true;
						}
					}
					if (!achou)
						indexEstacao++;
				}	
			}			
		}
		return solucao; 
	}
	
	/*
	 * Ordena a lista de estacoes pelo custoPorPonto
	 * Enquanto arrayPontosCobertos ainda tem 0
	 * 		Pego proximo ponto com 0 em arrayPontosCobertos
	 * 		Procuro em listaEstacoesFaltantes qual Estacao tem aquele ponto
	 * 		Somo 1 no indice de arraPontosCobertos cujo ponto esta naquela Estacao
	 * 		Removo a Estacao da listaEstacoesFaltantes 		 
	 * 
	 * */
	
}
